home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Prog / M / Lex.cpt / Lex / LEX Manual (TEXT) < prev    next >
Text File  |  1990-03-12  |  60KB  |  1,769 lines

  1. /*
  2.   HEADER: CUG     nnn.nn;
  3.   TITLE:     LEX - A Lexical Analyser Generator
  4.   VERSION:     1.0 for IBM-PC
  5.   DATE:      Jan 30, 1985
  6.   DESCRIPTION:     A Lexical Analyser Generator. From UNIX
  7.   KEYWORDS:     Lexical Analyser Generator YACC C PREP
  8.   SYSTEM:     IBM-PC and Compatiables
  9.   FILENAME:      LEX.MEM
  10.   WARNINGS:     This program is not for the casual user. It will
  11.  be useful primarily to expert developers.
  12.   CRC:         N/A
  13.   SEE-ALSO:     YACC and PREP
  14.   AUTHORS:     Scott Guthery 11100 leafwood lane Austin, TX 78750
  15.   COMPILERS:     DESMET-C
  16.   REFERENCES:     UNIX Systems Manuals
  17. */
  18.  
  19.   
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.                      DECUS C LANGUAGE SYSTEM
  47.  
  48.  
  49.                                LEX
  50.                    A lexical Analyser Generator
  51.  
  52.  
  53.                                 by
  54.  
  55.                         Charles H. Forsyth
  56.  
  57.                      University of Waterloo
  58.                      Waterloo, Ontario, N2L 3G1
  59.                      Canada
  60.  
  61.  
  62.                             Revised by
  63.  
  64.                   Robert B. Denny & Martin Minow
  65.  
  66.  
  67.  LEX  transforms  a  regular-expression  grammar  and  associated
  68.  action  routines into a C function and set of tables, yielding a
  69.  table-driven lexical analyser which manages to  be  compact  and
  70.  rapid.
  71.  
  72.  
  73.                   DECUS Structured Languages SIG
  74.  
  75.                        Version of 30-Oct-82
  76.  
  77.     
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.               Copyright (C) 1978, Charles H. Forsyth
  87.  
  88.  
  89.  
  90.  
  91.  
  92.           Modifications Copyright (C) 1980, 1982, DECUS
  93.  
  94.      General permission  to  copy  or  modify,  but  not  for
  95.      profit,  is  hereby  granted,  provided  that  the above
  96.      copyright notice is included and reference made  to  the
  97.      fact that reproduction privileges were granted by DECUS.
  98.  
  99.      The information in this document is  subject  to  change
  100.      without   notice  and  should  not  be  construed  as  a
  101.      commitment by Digital Equipment Corporation or by DECUS.
  102.  
  103.      Neither Digital Equipment Corporation,  DECUS,  nor  the
  104.      authors   assume  any  responsibility  for  the  use  or
  105.      reliability of this document or the described software.
  106.  
  107.      This software is  made  available  without  any  support
  108.      whatsoever.     The    person    responsible    for   an
  109.      implementation of this system should expect to  have  to
  110.      understand  and  modify  the source code if any problems
  111.      are  encountered  in  implementing  or  maintaining  the
  112.      compiler or its run-time library.  The DECUS 'Structured
  113.      Languages Special Interest Group' is the  primary  focus
  114.      for communication among users of this software.
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  UNIX is  a  trademark  of  Bell  Telephone  Laboratories.   RSX,
  125.  RSTS/E,  RT-11  and  VMS  are  trademarks  of  Digital Equipment
  126.  Corporation.
  127.  
  128.  
  129.  A Lexical Analyser Generator                                      Page 3
  130.  
  131.  
  132.  1.0  Introduction
  133.  
  134.  
  135.  A computer program often has an input stream which  is  composed
  136.  of  small elements, such as a stream of characters, and which it
  137.  would like to convert to larger elements in order to process the
  138.  data  conveniently.   A  compiler  is a common example of such a
  139.  program:  it reads a stream of characters forming a program, and
  140.  would  like  to turn this sequence of characters into a sequence
  141.  of larger items, namely identifiers, numbers, and operators, for
  142.  parsing.   In  a  compiler,  the  procedures  which  do this are
  143.  collectively called the  lexical  analyser,  or  scanner;   this
  144.  terminology will be used more generally here.
  145.  
  146.  It may happen that the speed with which this  transformation  is
  147.  done  will  noticeably affect the speed at which the rest of the
  148.  program operates.  It is certainly true that although such  code
  149.  is  rarely  difficult to write, writing and debugging it is both
  150.  tedious, and time-consuming,  and  one  typically  would  rather
  151.  spend  the  time  on  the hard parts of the program.  It is also
  152.  true that while certain transformations are easily  thought  of,
  153.  they   are  often  hard  to  express  succinctly  in  the  usual
  154.  general-purpose programming languages (eg, the description of  a
  155.  floating-point number).
  156.  
  157.  LEX is a program which tries to give a programmer a good deal of
  158.  help  in  this,  by  writing large parts of the lexical analyser
  159.  automatically, based on a description supplied by the programmer
  160.  of  the  items  to be recognised (which are known as tokens), as
  161.  patterns of the more basic elements of the  input  stream.   The
  162.  LEX  description  is  very  much  a special-purpose language for
  163.  writing lexical analysers, and LEX is then simply  a  translator
  164.  for  this  language.  The LEX language is easy to write, and the
  165.  resulting processor is compact and fast running.
  166.  
  167.  The purpose of a LEX program is to read  an  input  stream,  and
  168.  recognise tokens.  As the lexical analyser will usually exist as
  169.  a subroutine in a larger set  of  programs,  it  will  return  a
  170.  "token  number",  which  indicates  which  token  was found, and
  171.  possibly  a  "token  value",  which   provides   more   detailed
  172.  information  about the token (eg, a copy of the token itself, or
  173.  an index into a symbol  table).   This  need  not  be  the  only
  174.  possibility;   a  LEX program is often a good description of the
  175.  structure of the whole computation, and  in  such  a  case,  the
  176.  lexical  analyser might choose to call other routines to perform
  177.  the necessary actions whenever a particular token is recognised,
  178.  without reference to its own caller.
  179.  
  180.  A Lexical Analyser Generator                                      Page 4
  181.  
  182.  
  183.  2.0  The Lex Language
  184.  
  185.  LEX transforms a regular-expression grammar into a deterministic
  186.  finite-state  automaton that recognizes that grammar.  Each rule
  187.  of the grammar is associated with  an  action  which  is  to  be
  188.  performed  when  that rule successfully matches some part of the
  189.  input data.
  190.  
  191.  Because of the nature of regular  expression  grammars,  certain
  192.  language  constructions  cannot  be  recognized by LEX programs.
  193.  Specifically, expressions with balanced  parentheses  cannot  be
  194.  recognized.  This means that LEX cannot be used to recognize all
  195.  Fortran keywords as some  (DO,  IF,  and  FORMAT,  for  example)
  196.  require  elaborate  recognition to distinguish between ambiguous
  197.  constructions.
  198.  
  199.  
  200.  
  201.  2.1  Elementary Things
  202.  
  203.  
  204.  Strings,  characters,  sets  of  characters   called   character
  205.  classes,  and  operators  to  form  these into patterns, are the
  206.  fundamental elements of the LEX language.
  207.  
  208.  A string is a sequence of  characters,  not  including  newline,
  209.  enclosed  in  quotes,  or  apostrophes.   Within  a  string, the
  210.  following escape sequences
  211.  (which are those of the C language) allow any 8-bit character to
  212.  be  represented,  including  the  escape  character, quotes, and
  213.  newlines:
  214.  
  215.          \n      NL      (012)
  216.          \r      CR      (015)
  217.          \b      BS      (010)
  218.          \t      TAB     (011)
  219.          \"      "
  220.          \'      '
  221.          \c      c
  222.          \\      \
  223.          \NNN    (NNN)
  224.  
  225.  where NNN  is  a  number  in  octal,  and  c  is  any  printable
  226.  character.   A  string may be continued across a line by writing
  227.  the escape character before the newline.
  228.  
  229.  Outside a string, a sequence of upper-case letters stands for  a
  230.  sequence  of the equivalent lower-case letters, while a sequence
  231.  of lower-case letters is taken as the name of a LEX  expression,
  232.  and  handled  specially,  as described below.  These conventions
  233.  make the  use  of  named  expressions  and  the  description  of
  234.  lower-case  keywords (the usual case on Unix) fairly convenient.
  235.  Keywords in case-independent languages, such as Fortran, require
  236.  additional effort to match, as will be noted.
  237.  
  238.  A Lexical Analyser Generator                                      Page 5
  239.  
  240.  
  241.  An Ascii character other than one of
  242.  
  243.          () {} [ * | = ; % / \ ' " -
  244.  
  245.  may be used in LEX to stand for itself.
  246.  
  247.  A sequence of characters enclosed  by  brackets  ('['  and  ']')
  248.  forms  a  character class, which stands for all those characters
  249.  within the brackets.  If a circumflex ('^') follows the  opening
  250.  bracket,  then  the  class  will  instead  stand  for  all those
  251.  characters but those inside the brackets.  The escapes  used  in
  252.  strings may be used in character classes as well.
  253.  
  254.  Within a character class, the construction "A-B" (where "A"  and
  255.  "B" are arbitrary characters) stands for the range of characters
  256.  between "A" and "B" inclusive.
  257.  
  258.  For example,
  259.  
  260.          "ABC"           matches "abc"
  261.  
  262.          "[ABC]"         matches "A" or "B" or "C"
  263.  
  264.          "[A-Za-z0-9]"   matches all letters and digits
  265.  
  266.  Case-independent keyword recognition may be described  by  using
  267.  auxiliary  definitions  to  define expressions that match either
  268.  case.  For example,
  269.  
  270.          a = [Aa];
  271.          b = [Bb];
  272.          ...
  273.          z = [Zz];
  274.          %%
  275.          d o             Matches "DO", "do", "Do", or "dO"
  276.  
  277.  
  278.  
  279.  
  280.  2.2  Putting Things Together
  281.  
  282.  
  283.  Several operators are provided to allow construction of  a  type
  284.  of pattern called a regular expression.  Such expressions can be
  285.  implemented as finite-state automata (without memory or stacks).
  286.  A  reference  to  an  "occurrence"  of  a  regular expression is
  287.  generally taken to mean an occurrence of any string  matched  by
  288.  that  regular  expression.  The operators are presented in order
  289.  of decreasing priority.  In all cases, operators work on  either
  290.  strings or character classes, or on other regular expressions.
  291.  
  292.  Any string or character class forms a regular  expression  which
  293.  matches  whatever  the  string or character class stands for (as
  294.  described above).
  295.  
  296.  A Lexical Analyser Generator                                      Page 6
  297.  
  298.  
  299.  The operator '*' applied following a regular expression forms  a
  300.  new  regular  expression  which matches an arbitrary number (ie,
  301.  zero or more) of  adjacent  occurrences  of  the  first  regular
  302.  expression.   The  operation  is  often  referred to as (Kleene)
  303.  closure.
  304.  
  305.  The operation of concatenation of  two  regular  expressions  is
  306.  expressed  simply by writing the regular expressions adjacent to
  307.  each  other.   The  resulting  regular  expression  matches  any
  308.  occurrence  of the first regular expression followed directly by
  309.  an occurrence of the second regular expression.
  310.  
  311.  The operator  '|',  alternation,  written  between  two  regular
  312.  expressions   forms   a  regular  expression  which  matches  an
  313.  occurrence of the first regular expression or an  occurrence  of
  314.  the second regular expression.
  315.  
  316.  Any regular expression may be enclosed in parentheses  to  cause
  317.  the priority of operators to be overridden in the usual manner.
  318.  
  319.  A few examples should help to make all of this clear:
  320.  
  321.          "[0-9]*"        matches a (possibly empty)  sequence  of
  322.                          digits.
  323.  
  324.          "[A-Za-z_$][A-Za-z0-9_$]*"
  325.                          matches a C identifier.
  326.  
  327.          "([A-Za-z_$]|[0-9])*"
  328.                          matches a C identifier, or a sequence of
  329.                          digits,  or  a  sequence  of letters and
  330.                          digits intermixed, or nothing.
  331.  
  332.  
  333.  
  334.  
  335.  2.3  The General Form of Lex Programs
  336.  
  337.  
  338.  A LEX source input file consists of three sections:   a  section
  339.  containing   auxiliary   definitions,   a   section   containing
  340.  translations, and a section containing programs.
  341.  
  342.  Throughout a LEX program, spaces, tabs, and newlines may be used
  343.  freely, and PL/1-style comments:
  344.  
  345.          /* ... anything but '*/' ... */
  346.  
  347.  may be used, and are treated as a space.
  348.  
  349.  The auxiliary definition section must be present, separated from
  350.  following  sections  by the two-character sequence '%%', but may
  351.  be empty.  This  section  allows  definition  of  named  regular
  352.  
  353.  expressions,  which  provide  the useful ability to use names of
  354.  regular expressions in the  translation  section,  in  place  of
  355.  
  356.  A Lexical Analyser Generator                                      Page 7
  357.  
  358.  
  359.  common sub-expressions, or to make that section more readable.
  360.  
  361.  The translation section follows the '%%' sequence, and  contains
  362.  regular  expressions paired with actions which describe what the
  363.  lexical analyser should do when it discovers an occurrence of  a
  364.  given regular expression in its input stream.
  365.  
  366.  The program section may be omitted;  if it is present it must be
  367.  separated from the translation section by the '%%' sequence.  If
  368.  present, it may contain anything in general,  as  it  is  simply
  369.  tacked on to the end of the LEX output file.
  370.  
  371.  The style of this layout will be familiar to users of Yacc.   As
  372.  LEX  is  often used with that processor, it seemed reasonable to
  373.  keep to a similar format.
  374.  
  375.  
  376.  
  377.  2.4  Auxiliary Definitions
  378.  
  379.  
  380.  Given the set of regular expressions forming a complete  syntax,
  381.  there  are often common sub-expressions.  LEX allows these to be
  382.  named, defined  but  once,  and  referred  to  by  name  in  any
  383.  subsequent   regular  expression.   Note  that  definition  must
  384.  precede use.  A definition has the form:
  385.  
  386.          expression_name = regular_expression ;
  387.  
  388.  where a name is composed of a lower-case letter  followed  by  a
  389.  sequence  string  of letters and digits, and where an underscore
  390.  is considered a letter.  For example,
  391.  
  392.          digit   = [0-9];
  393.          letter  = [a-zA-Z];
  394.          name    = letter(letter|digit)*;
  395.  
  396.  The semicolon is needed to resolve some ambiguities in  the  LEX
  397.  syntax.
  398.  
  399.  Three  auxiliary  definitions  have  special  meaning  to   LEX:
  400.  "break",  "illegal",  and  "ignore."  They  are  all  defined as
  401.  character classes ("break = [,.?]", for example) and are used as
  402.  follows:
  403.  
  404.          break   An input token will always terminate if a member
  405.                  of the "break" class is scanned.
  406.  
  407.          illegal The "illegal"  class  allows  simplification  of
  408.                  error detection, as will be described in a later
  409.                  section.  If this  class  is  defined,  and  the
  410.                  lexical  analyser  stops  at  a  character  that
  411.                  "cannot"  occur  in  its  present  context,  the
  412.                  analyser  will  output  a suitable error message
  413.                  and ignore the offender.
  414.  
  415.  A Lexical Analyser Generator                                      Page 8
  416.  
  417.  
  418.          ignore  This class defines a set of characters that  are
  419.                  ignored by the analyser's input routine.
  420.  
  421.  
  422.  
  423.  
  424.  2.5  Translations
  425.  
  426.  
  427.  One would like to provide a description  of  the  action  to  be
  428.  taken  when  a  particular sequence of input characters has been
  429.  matched by a given regular expression.  The kind of action taken
  430.  might  vary  considerably, depending upon the application.  In a
  431.  compiler, typical actions are:  enter an identifer into a symbol
  432.  table,  read and store a string, or return a particular token to
  433.  the parser.  In text processing, one  might  wish  to  reproduce
  434.  most  of  the input stream on an output stream unchanged, making
  435.  substitutions when a particular sequence of characters is found.
  436.  In  general,  it  is  hard to predict what form the action might
  437.  take, and so, in LEX the nature of the action  is  left  to  the
  438.  user,  by allowing specification, for each regular expression of
  439.  interest, C-language code to be executed when a string  matching
  440.  that  expression  is  discovered  by  the driving program of the
  441.  lexical  analyser.   An  action,  together  with   its   regular
  442.  expression, is called a translation, and has the format:
  443.  
  444.          regular_expression { action }
  445.  
  446.  All of this may be spread across several lines.  The action  may
  447.  be empty, but the braces must appear.
  448.  
  449.  Earlier, it was argued that most general-purpose  languages  are
  450.  inappropriate for writing lexical analysers, and it is important
  451.  to see that the subsequent use of such a language  to  form  the
  452.  actions  is not a contradiction.  Most languages are fairly good
  453.  at  expressing  the  actions  described  above   (symbol   table
  454.  manipulation,  writing  character  strings,  and such).  Leaving
  455.  this part of the lexical analyser to those  languages  therefore
  456.  not  only  makes  sense,  but also ensures that decisions by the
  457.  writer of the lexical analyser generator will not  unduly  cramp
  458.  the  user's style.  However, general-purpose languages do not as
  459.  a rule provide inexpensive pattern matching facilities, or input
  460.  description formats, appropriate for describing or structuring a
  461.  lexical analyser.
  462.  
  463.  Allowing a user to provide his own code is not really enough, as
  464.  he  will  need  some  help  from  LEX  to obtain a copy of, or a
  465.  pointer to, the current token, if nothing else.  LEX provides  a
  466.  library  of C functions which may be called to obtain controlled
  467.  access to some of  the  data  structures  used  by  the  driving
  468.  programs  of  the  lexical  analyser.   These are described in a
  469.  later section.
  470.  
  471.  A Lexical Analyser Generator                                      Page 9
  472.  
  473.  
  474.  2.5.1  Numbers and Values -
  475.  
  476.  Typically, a lexical analyser will return a value to its  caller
  477.  indicating  which  token has been found.  Within an action, this
  478.  is done by writing a  C  return  statement,  which  returns  the
  479.  appropriate value:
  480.  
  481.          BEGIN   {
  482.                          return(T_BEGIN);
  483.                  }
  484.          name    {
  485.                          lookup(token(NULL));
  486.                          return(T_NAME);
  487.                  }
  488.          "/"     {
  489.                          return('/');
  490.                  }
  491.  
  492.  Note that function lookup() is provided by the user program.
  493.  
  494.  In many cases, other information must be supplied to its  caller
  495.  by  the scanner.  When an identifier is recognised, for example,
  496.  both a pointer to a symbol-table entry,  and  the  token  number
  497.  T_NAME  must  be returned, yet the C return statement can return
  498.  but a single value.  Yacc has a  similar  problem,  and  so  its
  499.  lexical  analyser  sets  an  external word 'yylval' to the token
  500.  value, while the token number is returned by the  scanner.   LEX
  501.  uses  the external 'yylval' (to be compatible), but, to make LEX
  502.  programs more readable when used alone, the name 'lexval' is set
  503.  by a #define statement to 'yylval'.  For example,
  504.  
  505.          name    {
  506.                          lexval = lookup(token(NULL));
  507.                          return(T_NAME);
  508.                  }
  509.  
  510.  
  511.  Certain  token  numbers  are  treated  specially;    these   are
  512.  automatically defined as manifests (see section 3.2) by LEX, and
  513.  all begin with the sequence 'LEX...' so as not to clash with the
  514.  user's own names.  There are two such tokens defined at present:
  515.  
  516.          LEXSKIP When  returned  by  a  user's  action   routine,
  517.                  LEXSKIP  causes  the  lexical analyser to ignore
  518.                  the current token (ie, it does  not  inform  the
  519.                  parser of its presence), and to look instead for
  520.                  a new token.  This may be used  when  a  comment
  521.                  sequence has been discovered, and discarded.  It
  522.                  is also useful when the action routine completes
  523.                  processing  of the token.  See the discussion of
  524.                  the comment() library function for an example of
  525.                  its usage.
  526.  
  527.          LEXERR  This  is  returned  by  the   lexical   analyser
  528.                  (function  yylex()) when an unrecognizable input
  529.  
  530.  A Lexical Analyser Generator                                     Page 10
  531.  
  532.  
  533.                  sequence has been detected.  By default,  LEXERR
  534.                  is 256.  This the same as the yacc error value.
  535.  
  536.  
  537.  To summarise, the token number is  set  by  the  action  with  a
  538.  return   statement,   and   the   token   value  (ie,  auxiliary
  539.  information) is set by assigning  this  value  to  the  external
  540.  integer 'lexval'.
  541.  
  542.  
  543.  
  544.  2.6  Declaration Sections
  545.  
  546.  
  547.  Declarations in the language of the actions may be  included  in
  548.  both  the  auxiliary  definition  section and in the translation
  549.  section.   In  the  former  case,  these  declarations  will  be
  550.  external  to  the lexical analyser, and in the latter case, they
  551.  will be local to the lexical analyser (ie, static, or  automatic
  552.  storage).    Declaration  sections  consist  of  a  sequence  of
  553.  declarations surrounded by the special bracketing sequences '%{'
  554.  and '%}' (as in Yacc).  The characters within these brackets are
  555.  copied unchanged into  the  appropriate  spots  in  the  lexical
  556.  analyser  program  that  LEX writes.  The examples in appendix A
  557.  suggest how these might be used.
  558.  
  559.  
  560.  
  561.  3.0  Using Lex from C
  562.  
  563.  
  564.  The present version of LEX is intended for use with C;   and  it
  565.  is this usage which will be described here.
  566.  
  567.  
  568.  
  569.  3.1  The Function yylex()
  570.  
  571.  
  572.  The structure  of  LEX  programs  is  influenced  by  what  Yacc
  573.  requires of its lexical analyser.
  574.  
  575.  To begin with, the lexical analyser must be named  'yylex',  has
  576.  no  parameters,  and is expected to return a token number, where
  577.  that number is determined by Yacc.   The  token  number  for  an
  578.  Ascii  character  is  its  Ascii  value  (ie,  its  value as a C
  579.  character constant).  Named tokens,  defined  in  yacc  '%token'
  580.  statements,  have a number above 256, with the particular number
  581.  accessible through a Yacc-produced #define of  the  given  token
  582.  name as its number.  Yacc also allows 'yylex' to pass a value to
  583.  the Yacc  action  routines,  by  assigning  that  value  to  the
  584.  external 'yylval'.
  585.  
  586.  LEX thus provides a lexical  analyser  function  named  'yylex',
  587.  which interprets tables constructed by the LEX program returning
  588.  
  589.  A Lexical Analyser Generator                                     Page 11
  590.  
  591.  
  592.  the token number returned by the actions  it  performs.   Values
  593.  assigned  to  lexval are available in 'yylval', so that use with
  594.  Yacc is straightforward.
  595.  
  596.  A value of zero is returned by 'yylex' at  end-of-file,  and  in
  597.  the absence of a return statement in an action, a non-zero value
  598.  is returned.   If  computation  is  performed  entirely  by  the
  599.  lexical analyser, then a suitable main program would be
  600.  
  601.          main()
  602.             {
  603.             while (yylex()) ;
  604.             }
  605.  
  606.  
  607.  
  608.  
  609.  3.2  Serial Re-Use of yylex()
  610.  
  611.  
  612.  The  yylex()  function  contains  several  variables  which  are
  613.  statically  initialized  at  compile time.  Once yylex() sees an
  614.  EOF (-1) input character, it will continue to return  NULL.   If
  615.  yylex()  is  to  be  used inside a loop which processes multiple
  616.  files, it must be re-initialized at the beginning  of  each  new
  617.  file  with  a  call  to  the  LEX library routine llinit().  For
  618.  example (slightly extending the previous example):
  619.  
  620.          main()
  621.             {
  622.             getfilelist();
  623.             for(file = first; file != last; file = next)
  624.                {
  625.                llinit();
  626.                while (yylex());
  627.                }
  628.             printf("All files done\n");
  629.             }
  630.  
  631.  The call to llinit() is unnecessary if  yylex()  is  to  process
  632.  only one file, or is kept from seeing an EOF input character.
  633.  
  634.  
  635.  
  636.  3.3  The Lex Table File
  637.  
  638.  
  639.  In the absence of instructions to the contrary (see below),  LEX
  640.  reads a given LEX language file, (from the standard input, if an
  641.  input file has not been specified) and produces a C program file
  642.  'lextab.c'  which  largely  consists  of  tables  which are then
  643.  interpreted by 'yylex()' (which is in  the  LEX  library).   The
  644.  actions  supplied  by  the user in each translation are combined
  645.  with a switch statement into a single function, which is  called
  646.  by  the table interpreter when a particular token is found.  The
  647.  
  648.  A Lexical Analyser Generator                                     Page 12
  649.  
  650.  
  651.  contents of the program section of the LEX file are added at the
  652.  end  of  the  output  file (lextab.c by default).  Normally, LEX
  653.  also inserts the lines
  654.  
  655.          #include <stdio.h>
  656.          #include <lex.h>
  657.  
  658.  at the top of the file;  this causes  declarations  required  by
  659.  the  standard  I/O  library and by LEX to be included when the C
  660.  program is compiled.
  661.  
  662.  
  663.  
  664.  3.4  Analyzers Which Don't Use "Standard I/O"
  665.  
  666.  
  667.  With  the  current  release,  LEX  supports  the  generation  of
  668.  analyzers  which  may be incorporated into programs which do not
  669.  use the "standard I/O" library.  By setting the "-s" switch,  as
  670.  shown  below, the generation of the "#include <stdio.h>" line is
  671.  supressed.  All references to standard I/O  specific  files  and
  672.  stdio.h  have  been removed from the LEX library (described in a
  673.  later section), with the  exception  of  lexgetc(),  lexerror(),
  674.  mapch() and lexecho(), which are standard I/O dependent.
  675.  
  676.  The declaration of yylex()'s input file iov pointer "lexin"  now
  677.  resides  in LEXGET.C (lexgetc()).  The code which defaults lexin
  678.  to stdin has been moved from yylex() to the table file.  yylex()
  679.  now  calls  the  routine  llstin(),  which is generated into the
  680.  table file.  There are no longer any hardwired references to the
  681.  variable   "lextab",  the  default  table  name.   Instead,  LEX
  682.  generates a call to lexswitch() in llstin(),  which  initializes
  683.  yylex()  to use the table whose name was given in a "-t" or "-e"
  684.  option in LEX's command line.  If neither was given, the default
  685.  name  "lextab" is used.  Once the initial table has been set up,
  686.  further automatic calls to lexswitch() are  supressed,  allowing
  687.  the user to manually switch tables as before.
  688.  
  689.  In addition, If the "-s" switch is not given (i.e.,  normal  use
  690.  with  standard  I/O), llstin() defaults lexin to stdin.  If "-s"
  691.  is given, llstin() is generated to do the lexswitch()  mentioned
  692.  above  only.  In any case, yylex() contains no references to the
  693.  standard I/O system.
  694.  
  695.  What all of this means is that under normal operation, you won't
  696.  notice  any  change  in LEX's characteristics.  In addition, you
  697.  may use the "-e" ("easy") switch, which will generate a C output
  698.  file  and  LEX tables which (conveniently) have the same name as
  699.  the input file, and everything will get  set  up  automagically.
  700.  If  you  specify the "-s" switch, the table file will contain no
  701.  references to the standard I/O package, and you may use  any  of
  702.  the  lexlib  routines  except  lexgetc(), lexerror(), mapch() or
  703.  lexecho().
  704.  
  705.  Don't forget that you  must  supply  your  own  startup  routine
  706.  
  707.  A Lexical Analyser Generator                                     Page 13
  708.  
  709.  
  710.  "$$main"  if  you  do not want the standard I/O library.  With a
  711.  bit of care in this regard, it will be  possible  to  link  your
  712.  program  with the C library without dragging in any I/O modules.
  713.  This prevents your having to build another library in  order  to
  714.  access  non-I/O  library  functions.  Just make the reference to
  715.  the C library the last one given to the linker or taskbuilder so
  716.  that  only  those routines which have not already been found are
  717.  pulled from CLIB.
  718.  
  719.  
  720.                                NOTE
  721.  
  722.      Programs that use LEX-generated analyzers and do not use
  723.      the standard I/O package must supply their own lexgetc()
  724.      and lexerror() routines.  Failure to do so  will  result
  725.      in undefined globals.
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  3.5  Operating LEX
  732.  
  733.  
  734.  LEX normally reads the grammar from the standard input,  writing
  735.  the  C  program  to  the  file  'lextab.c'.   It  may be further
  736.  controlled by using the following flags upon invocation:
  737.  
  738.          -i filename     The grammar is read from 'filename'.
  739.  
  740.          -o filename     The analyser is written to 'filename'.
  741.  
  742.          -t tablename    The default  finite-state  automaton  is
  743.                          named  lextab  (and  it  is, by default,
  744.                          written to  file  'lextab.c').   The  -t
  745.                          switch  causes the internal tables to be
  746.                          named 'tablename' and, if the -o  switch
  747.                          is    not   given,   written   to   file
  748.                          'tablename.c'.  This is necessary if the
  749.                          processor-switching         capabilities
  750.                          described in a later section are  to  be
  751.                          used.
  752.  
  753.          -e name         "Easy"  command  line.    "-e name"   is
  754.                          equivalent to typing
  755.  
  756.                             -i name.LXI -o name.C -t name
  757.  
  758.                          Do not  include  device  names  or  file
  759.                          extensions on the "easy" command line.
  760.  
  761.          -v [filename]   Internal state information is written to
  762.                          'filename.'   If   not   present,  state
  763.                          information   is   written    to    file
  764.                          'lex.out.'
  765.  
  766.  A Lexical Analyser Generator                                     Page 14
  767.  
  768.  
  769.          -d              Enable various debugging printouts.
  770.  
  771.          -s              Generate analyzer without references  to
  772.                          standard I/O
  773.  
  774.  
  775.  The command line  for  compilation  of  the  table  file  should
  776.  contain no surprises:
  777.  
  778.          cc -c -O lextab.c       (on Unix)
  779.  
  780.          xcc lextab -a           (on Dec operating systems)
  781.  
  782.  but when one is producing  the  running  program,  one  must  be
  783.  careful to include the necessary libraries.  On Unix, the proper
  784.  sequence is:
  785.  
  786.          cc userprog.o lextab.o -ll -lS
  787.  
  788.  The '-ll'  causes  the  LEX  library  (described  below)  to  be
  789.  searched,  and  the  '-lS' causes the Standard I/O library to be
  790.  used;  both libraries are required.  If Yacc is  used  as  well,
  791.  the  library  '-ly'  should  be  included before the '-ll'.  The
  792.  actual order and content of the rest  of  the  command  line  is
  793.  determined by the user's own requirements.
  794.  
  795.  If using the Decus C compiler, the lexical analyser built by LEX
  796.  is linked with c:lexlib.
  797.  
  798.  The complete process (assuming the  Decus  compiler  running  on
  799.  RSTS/E in RT11 mode) is thus:
  800.  
  801.          mcr lex -i grammar.lxi -o grammar.c     ! Build analyser
  802.          cc grammar                              ! Compile the
  803.          as grammar                              ! grammar table
  804.          link out=in,grammar,c:lexlib,c:suport,c:clib/b:2000
  805.  
  806.  
  807.  
  808.  
  809.  4.0  The Lex Library
  810.  
  811.  
  812.  All programs using grammars generated  by  LEX  must  be  linked
  813.  together  with  the LEX library.  On Unix, this is '/lib/libl.a'
  814.  (or '-ll' on the cc command line) and on DEC operating  systems,
  815.  C:LEXLIB  (LB:[1,1]LEX.OLB for RSX).  It contains routines which
  816.  are either essential or merely useful  to  users  of  LEX.   The
  817.  essential  routines  include  a  routine to obtain a copy of the
  818.  current token, and a routine to switch to  a  different  set  of
  819.  scanning  tables.  Routines of the second, useful, class perform
  820.  functions which might well be written by the user  himself,  but
  821.  are  there  to  save  him  the  bother;   including a routine to
  822.  process various forms of comments and  a  routine  to  transform
  823.  numbers  written  in arbitrary bases.  Both sets of routines are
  824.  
  825.  A Lexical Analyser Generator                                     Page 15
  826.  
  827.  
  828.  expected to grow as LEX sees use.
  829.  
  830.  Those functions which  produce  diagnostics  do  so  by  calling
  831.  lexerror(), which is called as
  832.  
  833.          lexerror(string, arg1, ..., argN)
  834.  
  835.  and is expected to write its arguments (likely using the "remote
  836.  format"  facility  of  the  fprintf()  function),  followed by a
  837.  newline, on  some  output  stream.   A  Lexerror()  function  is
  838.  included  in  the LEX library, but a user is free to include his
  839.  own.  The routine in the LEX library is standard I/O specific.
  840.  
  841.  
  842.                                NOTE
  843.  
  844.      The VAX/VMS native C library  does  not  support  remote
  845.      formats.   The  Lexerror  function  in  the  LEX library
  846.      conditionally compiles to support a call  to  lexerror()
  847.      with  only  an error message string.  Remote formats are
  848.      supported under Decus C.  Learn to use  them,  they  are
  849.      very nice!
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  4.0.1  Comment -- skip over a comment -
  856.  
  857.          comment(delim)
  858.          char delim[];
  859.  
  860.  Comment() may be called by a translation when  the  sequence  of
  861.  characters which mark the start of a comment in the given syntax
  862.  has been recognised by LEX.  It takes a string which  gives  the
  863.  sequence  of  characters  which  mark  the end of a comment, and
  864.  skips over characters in the input stream until this sequence is
  865.  found.   Newlines  found  while  skipping  characters  cause the
  866.  external 'yyline' to be incremented;  an unexpected  end-of-file
  867.  produces  a  suitable diagnostic.  Thus, 'comment("*/")' matches
  868.  C-style comments, and 'comment("\n")' matches as-style comments.
  869.  There  are  other  methods  of  handling  comments  in LEX;  the
  870.  comment() function is usually the best with regard to both space
  871.  and time.
  872.  
  873.  
  874.  
  875.  4.0.2  Gettoken -- obtain a copy of token -
  876.  
  877.          gettoken(buf, sizeof(buf))
  878.          char buf[];
  879.  
  880.  Gettoken() takes the address of a character buffer, and its size
  881.  in bytes, and copies the token most recently matched by LEX into
  882.  the buffer.  A null byte is added to mark the end of  the  token
  883.  
  884.  A Lexical Analyser Generator                                     Page 16
  885.  
  886.  
  887.  in  the  buffer, but, as null bytes are legitimate characters to
  888.  LEX, the true length of the token is returned by gettoken().
  889.  
  890.  For example, the following function calls lexlength() to  obtain
  891.  the  length  of a token.  It then calls the storage allocator to
  892.  allocate sufficient storage for the token and copies  the  token
  893.  into the allocated area.
  894.  
  895.          char *
  896.          save()
  897.          /*
  898.           * Save current token, return a pointer to it
  899.           */
  900.          {
  901.                  register char   *tbuffer;
  902.                  register int    len;
  903.                  register char   *tend;
  904.                  extern char     *token();
  905.                  extern char     *copy();
  906.  
  907.                  len = lexlength() + 1;
  908.                  if (tbuffer = malloc(len)) == NULL)
  909.                          error("No room for token");
  910.                  gettoken(tbuffer, len);
  911.                  return(tbuffer);
  912.          }
  913.  
  914.  
  915.  
  916.  
  917.  4.0.3  Integ -- long integer, any base -
  918.  
  919.          long
  920.          integ(nptr, base)
  921.          char *nptr;
  922.  
  923.  Integ() converts the Ascii string at 'nptr' into a long integer,
  924.  which  it  returns.   Conversion  stops  at the first non-digit,
  925.  where the digits are  taken  from  the  class  "[0-9a-zA-Z]"  as
  926.  limited by the given 'base'.  Integ() does not understand signs,
  927.  nor are blanks or tabs allowed in the string.
  928.  
  929.  
  930.  
  931.  4.0.4  Lexchar -- steal character -
  932.  
  933.          lexchar()
  934.  
  935.  Lexchar() returns the next character from the LEX input  stream.
  936.  (This  means  that  LEX  will  no  longer  see  it.)  LEX uses a
  937.  look-ahead buffer to handle complex languages, and this function
  938.  takes this into account.
  939.  
  940.  A Lexical Analyser Generator                                     Page 17
  941.  
  942.  
  943.  4.0.5  Lexecho -- write token to a file (STDIO ONLY) -
  944.  
  945.          lexecho(fp);
  946.          FILE *fp;
  947.  
  948.  Lexecho() may be called by a LEX action  routine  to  write  the
  949.  current token to a specified file.
  950.  
  951.  
  952.                                NOTE
  953.  
  954.      Programs using analyzers built with  LEX's  "-s"  switch
  955.      must supply their own lexecho() function if needed.
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  4.0.6  Lexgetc -- supply characters to yylex (STDIO ONLY) -
  962.  
  963.          lexgetc()
  964.  
  965.  Lexgetc() is called by the lexical analyser to obtain characters
  966.  from  its input stream.  The version in the library is dependent
  967.  on the standard I/O package, and is:
  968.  
  969.          FILE *lexin;    /* Declare iov address locally */
  970.          lexgetc()
  971.          {
  972.                  return(getc(lexin));
  973.          }
  974.  
  975.  If lexin is NULL when yylex() is entered, it will be assigned to
  976.  stdin.   This  is done by yylex() calling the function llstin(),
  977.  which is generated in the table file.  Unless the "-s" switch is
  978.  given  to  LEX,  the llstin() function assigns lexin to stdin if
  979.  lexin is NULL.  If the  "-s"  switch  was  given,  the  llstin()
  980.  routine  is  a  no-op.   The user may provide his own version of
  981.  lexgetc() to pre-process the data to the lexical  analyser.   An
  982.  example of this is shown in the appendix.
  983.  
  984.  
  985.                                NOTE
  986.  
  987.      Programs using analyzers built with  LEX's  "-s"  switch
  988.      must  supply  their  own lexgetc() function, and "lexin"
  989.      has no meaning in this context.
  990.  
  991.  
  992.  
  993.  A Lexical Analyser Generator                                     Page 18
  994.  
  995.  
  996.  4.0.7  Lexlength -- return length of a token. -
  997.  
  998.          lexlength();
  999.  
  1000.  Lexlength() may be called by a LEX action routine to obtain  the
  1001.  length  of  the  current  token in bytes.  An example of this is
  1002.  shown in the description of gettoken().
  1003.  
  1004.  
  1005.  
  1006.  4.0.8  Lexpeek -- examine character -
  1007.  
  1008.          lexpeek()
  1009.  
  1010.  Lexpeek() performs a function similar to that of Lexchar(),  but
  1011.  does  not  have  the  side-effect of removing the character from
  1012.  LEX's view.
  1013.  
  1014.  
  1015.  
  1016.  4.0.9  Lexswitch -- switch scanning tables -
  1017.  
  1018.          struct lextab *
  1019.          lexswitch(newtb)
  1020.          struct lextab *newtb;
  1021.  
  1022.  Lexswitch() is called to cause LEX to use a  different  scanning
  1023.  table;  it returns a pointer to the one previously in use.  This
  1024.  facility is useful if  certain  objects  of  the  language  (eg,
  1025.  strings  in  C) have a fairly complicated structure of their own
  1026.  which cannot be handled within the translation  section  of  the
  1027.  LEX description of the larger language.
  1028.  
  1029.  
  1030.  
  1031.  4.0.10  Llinit -- Reinitialize yylex() -
  1032.  
  1033.          llinit()
  1034.  
  1035.  Llinit() is a function which resets the state of yylex() to it's
  1036.  cold-start   condition.   Several  of  yylex()'s  variables  are
  1037.  initialized at compile time, and must be reinitialized if it  is
  1038.  to  be serially re-used.  An example of this is where yylex() is
  1039.  repeatedly called inside a loop which processes  multiple  input
  1040.  files.  Each time a new file is started, llinit() must be called
  1041.  before the first call to yylex() for the new file.
  1042.  
  1043.  A Lexical Analyser Generator                                     Page 19
  1044.  
  1045.  
  1046.  4.0.11  Mapch -- Handle C escapes within strings (STDIO ONLY) -
  1047.  
  1048.          int mapch(delim, esc)
  1049.          char delim;
  1050.          char esc;
  1051.  
  1052.  Mapch() is a function which handles C "escape"  characters  such
  1053.  as "\n" and "\nnn".  It will scan off the entire escape sequence
  1054.  and return the equivalent ASCII code as an integer.  It is meant
  1055.  for  use  with  YACC while scanning quoted strings and character
  1056.  constants.
  1057.  
  1058.  If it encounters EOF while  scanning,  it  calls  lexerror()  to
  1059.  print  an  error message warning of "Unterminated string".  If a
  1060.  normal character is  read,  it  returns  the  ASCII  value.   If
  1061.  "delim"  (usually " or ') is read, it returns EOF.  If a newline
  1062.  (ASCII linefeed) is read, it increments the global "yyline"  and
  1063.  calls itself recursively for the next line of input.  It may use
  1064.  the ungetc() function to back up in the input stream.
  1065.  
  1066.  
  1067.                                NOTE
  1068.  
  1069.      This routine is very application-specific for use by LEX
  1070.      and  YACC  when  they  are working together.  You should
  1071.      read the code in MAPCH.C before using this function.
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  4.0.12  Token -- get pointer to token -
  1078.  
  1079.          char *
  1080.          token(end_pointer)
  1081.          char **end_pointer;
  1082.  
  1083.  Token() locates the first byte of the current token and  returns
  1084.  its  address.   It  takes  an argument which is either NULL or a
  1085.  pointer to a character pointer;  if the latter, that pointer  is
  1086.  set  to  point  to  the  byte after the last byte of the current
  1087.  token.  Token() is slightly faster,  and  more  convenient  than
  1088.  gettoken()  for  those  cases where the token is only one or two
  1089.  bytes long.
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  5.0  Error Detection and Recovery
  1095.  
  1096.  
  1097.  If a character is detected in the input stream which  cannot  be
  1098.  added  to  the  last-matched  string,  and  which cannot start a
  1099.  string, then that character is considered illegal by  LEX.   LEX
  1100.  
  1101.  may be instructed to return a special 'error' token, or to write
  1102.  
  1103.  A Lexical Analyser Generator                                     Page 20
  1104.  
  1105.  
  1106.  a diagnostic with lexerror().  At present,  the  former  is  the
  1107.  default action.
  1108.  
  1109.  The token LEXERR is a special value which is recognised by Yacc,
  1110.  and causes it to start its own error recovery.  It is defined by
  1111.  the header file lex.h for use by other programs.
  1112.  
  1113.  Often, it makes more sense to simply type a suitable diagnostic,
  1114.  and  continue by ignoring the offending character.  It is fairly
  1115.  easy to cause  LEX  to  do  this,  by  including  the  auxiliary
  1116.  definition:
  1117.  
  1118.          illegal = [\0-\377];
  1119.  
  1120.  which defines a  character  class  "illegal"  which  is  handled
  1121.  specially  by LEX.  If the character that is causing the trouble
  1122.  is a member of that character class (and  in  the  example,  all
  1123.  characters  are),  then  LEX will write a diagnostic, and ignore
  1124.  it;  otherwise, it will return the special token LEXERR
  1125.  
  1126.  More comprehensive  techniques  may  be  added  as  they  become
  1127.  apparent.
  1128.  
  1129.  
  1130.  
  1131.  6.0  Ambiguity and Look-ahead
  1132.  
  1133.  Many computer languages have ambiguous grammars in that an input
  1134.  token  may represent more than one logical entity.  This section
  1135.  discusses the  way  in  which  grammars  built  by  LEX  resolve
  1136.  ambiguous  input,  as  well  as  a way for the grammar to assign
  1137.  unique meaning to a token by looking ahead in the input stream.
  1138.  
  1139.  
  1140.  
  1141.  6.1  Resolving Ambiguities
  1142.  
  1143.  
  1144.  A LEX program may be ambiguous, in the sense that  a  particular
  1145.  input  string  or  strings  might  be  matched  by  the  regular
  1146.  expression of more than one translation.  Consider,
  1147.  
  1148.          [a-z] { putchar(*token(NULL)); }
  1149.          aaa*  { printf("abc"); }
  1150.  
  1151.  in which the string 'aa' is matched by both regular  expressions
  1152.  (twice  by the first, and once by the second).  Also, the string
  1153.  'aaaaaa' may be matched in many  different  ways.   LEX  has  to
  1154.  decide    somehow    which    actions   should   be   performed.
  1155.  (Alternatively, it could produce a diagnostic, and give up.   As
  1156.  it happens, LEX never does this.)
  1157.  
  1158.  Consider a second example,
  1159.  
  1160.          letter = [a-z];
  1161.  
  1162.  A Lexical Analyser Generator                                     Page 21
  1163.  
  1164.  
  1165.          %%
  1166.          A(letter)*      { return(1); }
  1167.          AB(letter)*     { return(2); }
  1168.  
  1169.  which attempts to distinguish sequences of  letters  that  begin
  1170.  with 'a' from similar sequences that begin with 'ab'.  These two
  1171.  examples illustrate two different kinds of  ambiguity,  and  the
  1172.  following indicates how LEX resolves these.
  1173.  
  1174.  In the first example, it seems likely that  the  intent  was  to
  1175.  have both 'aa' and 'aaaaaa' perform the second action, while all
  1176.  single letters 'a' cause the first action to be performed.   LEX
  1177.  does  this  by  ensuring  that  the longest possible part of the
  1178.  input stream will be used to determine the match.  Thus,
  1179.  
  1180.          <       { return(LESS); }
  1181.          <=      { return(LESSEQ); }
  1182.  
  1183.  or
  1184.  
  1185.          digit(digit)*           { return(NUMBER); }
  1186.          letter(letter|digit)*   { return(NAME); }
  1187.  
  1188.  would work as one might expect.
  1189.  
  1190.  In the second example, the longest-string need not work.  On the
  1191.  string  "abb9",  either  action could apply, and so another rule
  1192.  must be followed.  This states that if, after the longest-string
  1193.  rule  has  been  applied,  there  remains an ambiguity, then the
  1194.  action which appears first in the LEX  program  file  is  to  be
  1195.  performed.   As the second example is written, the second action
  1196.  will never be performed.  It would have been written as:
  1197.  
  1198.          letter = [a-z];
  1199.          %%
  1200.          AB(letter)*     { return(1); }
  1201.          A(letter)*      { return(2); }
  1202.  
  1203.  The two rules together completely determine a string.
  1204.  
  1205.  At present, LEX produces  no  diagnostic  in  either  case;   it
  1206.  merely  applies  the  rules  and  proceeds.   In  the case where
  1207.  priority is given to the first-appearing rule,  it  might  be  a
  1208.  good idea to produce a diagnostic.
  1209.  
  1210.  
  1211.  
  1212.  6.2  Look-ahead
  1213.  
  1214.  
  1215.  Some facility for looking ahead in the input stream is sometimes
  1216.  required.   (This  facility  might also be regarded as a way for
  1217.  the  programmer  to  more  closely   control   LEX's   ambiguity
  1218.  resolution  process.)  For example, in C, a name followed by "("
  1219.  is to be contextually declared as an external function if it  is
  1220.  
  1221.  A Lexical Analyser Generator                                     Page 22
  1222.  
  1223.  
  1224.  otherwise undefined.
  1225.  
  1226.  In Pascal, look-ahead is required to determine that
  1227.  
  1228.          123..1234
  1229.  
  1230.  is an  integer  123,  followed  by  the  subrange  symbol  "..",
  1231.  followed  by  the  integer 1234, and not simply two real numbers
  1232.  run together.
  1233.  
  1234.  In both of these cases, the desire is to look ahead in the input
  1235.  stream  far  enough  to  be able to make a decision, but without
  1236.  losing tokens in the process.
  1237.  
  1238.  A special  form  of  regular  expression  is  used  to  indicate
  1239.  look-ahead:
  1240.  
  1241.          re1 '/' re2     '{' action '}'
  1242.  
  1243.  where 're1' and 're2' are regular  expressions.   The  slash  is
  1244.  treated  as  concatenation for the purposes of matching incoming
  1245.  characters;  thus both 're1' and 're2' must match adjacently for
  1246.  the  action  to  be performed.  'Re1' indicates that part of the
  1247.  input string which is the token  to  be  returned,  while  're2'
  1248.  indicates  the context.  The characters matched by 're2' will be
  1249.  re-read at the next call to yylex(), and broken into tokens.
  1250.  
  1251.  Note that you cannot write:
  1252.  
  1253.          name = re1 / re2;
  1254.  
  1255.  The look-ahead operator must be part of the  rule.   It  is  not
  1256.  valid in definitions.
  1257.  
  1258.  In the first example, the look-ahead operator would be used as:
  1259.  
  1260.          name / "(" {
  1261.                          if (name undefined)
  1262.                                  declare name a global function;
  1263.                  }
  1264.          name    {       /* usual processing for identifiers */
  1265.                  }
  1266.  
  1267.  In the second example, the range construction would be parsed as
  1268.  follows:
  1269.  
  1270.          digit   = [0-9];
  1271.          int     = digit(digit)*;
  1272.          %%
  1273.          int / ".." int  { /* Start of a range */
  1274.          ".." int        { /* End of a range   */
  1275.  
  1276.  
  1277.  Note that right-context is  not  sufficient  to  handle  certain
  1278.  types of ambiguity, as is found in several places in the Fortran
  1279.  
  1280.  A Lexical Analyser Generator                                     Page 23
  1281.  
  1282.  
  1283.  language.  For example,
  1284.  
  1285.          do i = 1        Is an assignment statement
  1286.          do i = 1, 4     Is a DO statement
  1287.  
  1288.  It is not sufficient to use right-context scanning to  look  for
  1289.  the   comma,   as   it   may   occur   within   a  parenthesized
  1290.  sub-expression:
  1291.  
  1292.          do i = j(k,l)   Is an assignment statement
  1293.  
  1294.  In Fortran, similar problems exist for IF and FORMAT statements,
  1295.  as  well  as counted (Hollerith) string constants.  All of these
  1296.  require a more  powerful  grammar  than  is  possible  with  LEX
  1297.  regular-expressions.
  1298.  
  1299.  
  1300.  
  1301.  7.0  Multiple Scanning Tables; Processor Switching
  1302.  
  1303.  
  1304.  Even a fairly simple syntax may be difficult, or impossible,  to
  1305.  describe  and  process  with  a  single set of translations.  An
  1306.  example of this may be found in C, where strings, which are part
  1307.  of  the language, have quite a different structure, and in order
  1308.  to process them, either a function must be  called  which  reads
  1309.  and parses the input stream for itself, or some mechanism within
  1310.  LEX must be invoked to  cause  a  (usually  massive)  change  of
  1311.  state.
  1312.  
  1313.  LEX does provide such a facility, which is known, after AED,  as
  1314.  'processor  switching'.   Yylex()  locates  its tables through a
  1315.  pointer;  if one simply changes the pointer to point  at  a  new
  1316.  set  of  tables,  one  will have effected the required change of
  1317.  state.  The LEX library function lexswitch(), which is described
  1318.  elsewhere  in  this guide, arranges to do this;  it also returns
  1319.  the old value of the pointer so that it may  be  restored  by  a
  1320.  later  call  to  Lexswitch.   Thus, scanning environments may be
  1321.  stacked, or not, as the user requires.
  1322.  
  1323.  
  1324.  
  1325.  7.1  Creation of a Processor
  1326.  
  1327.  
  1328.  It should be clear that if all the tables produced by LEX from a
  1329.  user's translation file have the same name, someone (the loader)
  1330.  is bound to object.  Some method must be provided to change  the
  1331.  name of the table.
  1332.  
  1333.  This is done by an option flag to the LEX command:
  1334.  
  1335.          -t name
  1336.  
  1337.  will cause the scanning table to be declared as
  1338.  
  1339.  A Lexical Analyser Generator                                     Page 24
  1340.  
  1341.  
  1342.          struct lextab name;
  1343.  
  1344.  so that it may be passed to LEXswitch:
  1345.  
  1346.          lexswitch(&name);
  1347.  
  1348.  LEX also writes the program file to  the  file  "name.c"  rather
  1349.  than to "lextab.c."
  1350.  
  1351.  
  1352.                                NOTE
  1353.  
  1354.      If you use the "easy"  command  line  ("-e  name")  when
  1355.      running  LEX,  the  output  file  and  table  names will
  1356.      correspond nicely.  Re-read the section on operating LEX
  1357.      for more details.
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  8.0  Conclusion
  1364.  
  1365.  
  1366.  LEX seems to handle most lexical analysis tasks easily.  Indeed,
  1367.  LEX   may  be  more  generally  used  to  write  commands  of  a
  1368.  text-processing nature;  an example of such usage may  be  found
  1369.  in  an  appendix.  LEX programs are far easier to write than the
  1370.  equivalent  C  programs,  and  generally  consume   less   space
  1371.  (although  there  is  an  initial  overhead for the more general
  1372.  table-interpreter  program).   The  encoding  suggested  in  [4]
  1373.  achieves   a  reasonable  compromise  between  table  size,  and
  1374.  scanning speed.  Certainly lexical analysers  are  less  tedious
  1375.  and time-consuming to write.
  1376.  
  1377.  It is expected that most change in the future  will  be  through
  1378.  additions  to  the  LEX  library.   The  LEX language may change
  1379.  slightly to accomodate common kinds  of  processing  (eg,  break
  1380.  characters),  or  to  extend  its range of application.  Neither
  1381.  kind of change should affect existing LEX programs.
  1382.  
  1383.  LEX produces tables and programs for the C language.  The tables
  1384.  are  in a very simple (and stylised) format, and when LEX copies
  1385.  the action routines or the program section, the  code  might  as
  1386.  well  be Fortran for all it cares.  One could write Unix filters
  1387.  to  translate  the  very  simple  C  format  tables  into  other
  1388.  languages,  allowing  LEX  to  be  used  with a larger number of
  1389.  languages, with little extra development  cost.   This  seems  a
  1390.  likely future addition.
  1391.  
  1392.  Because of the look-ahead necessary to  implement  the  "longest
  1393.  string  match"  rule, LEX is unsuitable for interactive programs
  1394.  whose overall structure is:
  1395.  
  1396.          for (;;) {
  1397.  
  1398.  A Lexical Analyser Generator                                     Page 25
  1399.  
  1400.  
  1401.                  prompt_user();
  1402.                  get_input();
  1403.                  process();
  1404.                  print_output();
  1405.          }
  1406.  
  1407.  If these are rewritten as LEX-generated grammars, the user  will
  1408.  be  confused  by the fact the second input datum must be entered
  1409.  before the first is processed.  It is  possible  to  solve  this
  1410.  dilemna   by   rewriting   function   lexgetc()   to  return  an
  1411.  "end-of-line" character until processing is  complete  for  that
  1412.  line.  An example is shown in the Appendix.
  1413.  
  1414.  
  1415.  
  1416.  9.0  Acknowledgements
  1417.  
  1418.  
  1419.  LEX  is  based  on  a  processor  of  the  same  name  at   Bell
  1420.  Laboratories,   which  also  runs  under  Unix  [3],  and,  more
  1421.  distantly, on AED-0 [1].  This version of LEX was based  on  the
  1422.  description  and suggestions of [4], although the implementation
  1423.  differs significantly in a number of ways.
  1424.  
  1425.  
  1426.  
  1427.  10.0  References
  1428.  
  1429.  
  1430.       1. Johnson,  W.L.,  et.   al.,  "Automatic  generation   of
  1431.          efficient   lexical   analysers   using   finite   state
  1432.          techniques", CACM Vol.  11, No.  12, pp.  805-813, 1968.
  1433.  
  1434.       2. Johnson, S.C., "Yacc -- Yet Another  Compiler-Compiler",
  1435.          CSTR-32,  Bell  Telephone Laboratories, Murray Hill, New
  1436.          Jersey, 1974.
  1437.  
  1438.       3. Lesk,  M.E.,  "Lex  -  a  lexical  analyser  generator",
  1439.          CSTR-39,  Bell  Telephone Laboratories, Murray Hill, New
  1440.          Jersey, 1975.
  1441.  
  1442.       4. Aho, A.V., Ullman, J.D., Principles of Compiler  Design,
  1443.  
  1444.          Addison-Wesley, Don Mills, Ontario, 1977.
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.                             APPENDIX A
  1459.  
  1460.                         LEX SOURCE GRAMMAR
  1461.  
  1462.  
  1463.  
  1464.  The following is a  grammar  of  LEX  programs  which  generally
  1465.  follows  Bacus-Naur  conventions.  In the rules, "||" stands for
  1466.  alternation (choose one  or  the  other).   Other  graphic  text
  1467.  stands  for  itself.   Several  grammar  elements  have  special
  1468.  meaning:
  1469.  
  1470.          <anything>      Any text  not  including  the  following
  1471.                          grammar  element  (either  a  literal or
  1472.                          end-of-file).
  1473.  
  1474.          <nothing>       Nothing  --  used  for   optional   rule
  1475.                          elements.
  1476.  
  1477.          <name>          A variable name.
  1478.  
  1479.          <char_class>    A character class specifier.
  1480.  
  1481.          <string>        A string (text inclosed in '"').
  1482.  
  1483.          <EOF>           The end of the input file.
  1484.  
  1485.  This grammar was  abstracted  from  the  Yacc  grammar  used  to
  1486.  describe LEX.
  1487.  
  1488.          program :==             aux_section trans_section
  1489.  
  1490.          aux_section ::=         auxiliaries %%
  1491.                          ||      %%
  1492.  
  1493.          auxiliaries ::=         auxiliaries aux_def
  1494.                          ||      aux_def
  1495.  
  1496.          aux_def ::=             name_def = reg_exp ;
  1497.                          ||      %{ <anything> %}
  1498.  
  1499.          name_def ::=            <name>
  1500.  
  1501.          reg_exp ::=             <char_class>
  1502.                          ||      <string>
  1503.                          ||      <name>
  1504.  
  1505.  A Lexical Analyser Generator                                    Page A-2
  1506.  LEX Source Grammar
  1507.  
  1508.  
  1509.                          ||      reg_exp *
  1510.                          ||      reg_exp | reg_exp
  1511.                          ||      reg_exp  reg_exp
  1512.                          ||      ( reg_exp )
  1513.  
  1514.          trans_section ::=       translations
  1515.                          ||      <nothing>
  1516.  
  1517.          translations ::=        translations translation
  1518.                          ||      translation
  1519.  
  1520.          translation ::=         pattern action
  1521.                          ||      %{ <anything> %}
  1522.                          ||      %% <anything> <EOF>
  1523.  
  1524.          pattern ::=             reg_exp / reg_exp
  1525.                          ||      reg_exp
  1526.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538.  
  1539.                             APPENDIX B
  1540.  
  1541.                        SOME SMALL EXAMPLES
  1542.  
  1543.  
  1544.  
  1545.  
  1546.  
  1547.  The following example illustrates  the  use  of  the  look-ahead
  1548.  operator, and various other of the nuances of using LEX.
  1549.  
  1550.  
  1551.  
  1552.  B.1  A Complete Command
  1553.  
  1554.  
  1555.  The C programming language has had two different ways of writing
  1556.  its  assignment  operators.   The original method was to write a
  1557.  binary operator immediately following  the  ordinary  assignment
  1558.  operator, forming a compound operator.  Thus 'a =+ b' caused the
  1559.  value of 'a+b' to be assigned to 'a'.  Similarly,
  1560.  
  1561.          =- =/ =% =* =<< =>> =| =& =^
  1562.  
  1563.  were written  for  the  assignment  operators  corresponding  to
  1564.  subtraction,  division,  modulus,  multiplication,  left  shift,
  1565.  right shift, logical OR, logical AND, and exclusive OR.  In  the
  1566.  current  version of the language, the binary operator is written
  1567.  to the left of the  assignment  operator,  to  remove  potential
  1568.  ambiguity.
  1569.  
  1570.  The LEX program "ctoc"  is  a  filter  which  converts  programs
  1571.  written  in  the  older style into programs written in the newer
  1572.  style.   It  uses  the  look-ahead  operator,  and  the  various
  1573.  dis-ambiguating rules to ensure that sequences like
  1574.  
  1575.          a==-1           a=++b
  1576.  
  1577.  remain unchanged.
  1578.  
  1579.  A Lexical Analyser Generator                                    Page B-2
  1580.  Some Small Examples
  1581.  
  1582.  
  1583.  /*
  1584.   * ctoc.lxi  --  Convert old C operators to new C form
  1585.   *
  1586.   * Adapted from example in C. Forsythe's LEX manual.
  1587.   *
  1588.   * NOTE:
  1589.   *      Forsythe's program put an entire comment into the token
  1590.   *      buffer. Either define a huge token buffer for my typical
  1591.   *      monster comments, or filter text within comments as if
  1592.   *      it were real C code. This is what I did. So =+ inside
  1593.   *      a comment will get changed to +=, etc.  Note tnat you
  1594.   *      may use the commen() function in LEXLIB if you want the
  1595.   *      comments eaten. I wanted 'em in the output.
  1596.   * by
  1597.   *      Bob Denny
  1598.   *      31-Feb-81
  1599.   */
  1600.  %{
  1601.  char tbuf[80];          /* Token buffer */
  1602.  main()
  1603.    {
  1604.    while (yylex())
  1605.      ;
  1606.    }
  1607.  %}
  1608.  any             = [\0-\177];
  1609.  nesc            = [^\\];
  1610.  nescquote       = [^\\"];
  1611.  nescapost       = [^\\'];
  1612.  schar           = "\\" any | nescquote;
  1613.  cchar           = "\\" any | nescapost;
  1614.  string          = '"' schar* '"';
  1615.  charcon         = "'" cchar* "'";
  1616.  %%
  1617.  "=" ( << | >> | "*" | + | - | "/" | "%" | "&" | "|" | "^" )
  1618.                  {
  1619.                  gettoken(tbuf, sizeof tbuf);
  1620.                  printf("%s=",tbuf+1);
  1621.                  }
  1622.  /*
  1623.   * The following will overflow the token buffer on any but a
  1624.   * small comment:
  1625.   */
  1626.  /*********
  1627.  "/*" ([^*] | "*"[^/])* "*/"
  1628.          {
  1629.                  lexecho(stdout);
  1630.          }
  1631.  **********/
  1632.  [<=>!]"=" | "="[<>]
  1633.                  {
  1634.                  lexecho(stdout);
  1635.                  }
  1636.  "=" / ( ++ | -- )
  1637.  
  1638.  A Lexical Analyser Generator                                    Page B-3
  1639.  Some Small Examples
  1640.  
  1641.  
  1642.                  {
  1643.                  lexecho(stdout);
  1644.                  }
  1645.  charcon
  1646.                  {
  1647.                  lexecho(stdout);
  1648.                  }
  1649.  string
  1650.                  {
  1651.                  lexecho(stdout);
  1652.                  }
  1653.  [\0-\377]
  1654.                  {
  1655.                  lexecho(stdout);
  1656.                  }
  1657.  
  1658.  
  1659.  Assuming the Decus compiler running on RSTS/E in RT11 mode,  the
  1660.  above program would be built and executed as follows:
  1661.  
  1662.          mcr     lex -i ctoc.lxi -o ctoc.c
  1663.          cc      ctoc/v
  1664.          as      ctoc/d
  1665.          link    ctoc=ctoc,c:lexlib,c:suport,c:clib/b:2000
  1666.  
  1667.          mcr ctoc <old.c >new.c
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  B.2  Interactive Lexical Analysis
  1673.  
  1674.  The following program reads words from  the  terminal,  counting
  1675.  each  as they are entered.  The interaction with the operator is
  1676.  "natural" in the sense that processing for one line is  complete
  1677.  before  the  next  line is input.  To implement this program, it
  1678.  was necessary to include a special version  of  lexgetc()  which
  1679.  returns   <NULL>   if  the  current  line  has  been  completely
  1680.  transmitted to the parser.  Because the parser must  still  have
  1681.  some  look-ahead context, it will return the "end-of-line" token
  1682.  twice at  the  beginning  of  processing.   This  required  some
  1683.  additional tests in the main program.
  1684.  
  1685.  /*
  1686.   * Count words -- interactively
  1687.   */
  1688.  white   = [\n\t ];      /* End of a word        */
  1689.  eol     = [\0];         /* End of input line    */
  1690.  any     = [!-~];        /* All printing char's  */
  1691.  illegal = [\0-\377];    /* Skip over junk       */
  1692.  %{
  1693.  char            line[133];
  1694.  char            *linep          = &line;
  1695.  int             iseof           = 0;
  1696.  
  1697.  A Lexical Analyser Generator                                    Page B-4
  1698.  Some Small Examples
  1699.  
  1700.  
  1701.  int             wordct          = 0;
  1702.  #define T_EOL   1
  1703.  main()
  1704.  {
  1705.          register int    i;
  1706.          while ((i = yylex()) != 0) {
  1707.                  /*
  1708.                   * If the "end-of-line"  token  is
  1709.                   * returned  AND  we're  really at
  1710.                   * the end of  a  line,  read  the
  1711.                   * next line.  Note that T_EOL is
  1712.                   * returned twice when the program
  1713.                   * starts because of the nature of
  1714.                   * the look-ahead algorithms.
  1715.                   */
  1716.                  if (i == T_EOL && !is_eof
  1717.                                  && *linep == 0) {
  1718.                          printf("* ");
  1719.                          fflush(stdout);
  1720.                          getline();
  1721.                  }
  1722.          }
  1723.          printf("%d words\n", wordct);
  1724.  }
  1725.  %}
  1726.  %%
  1727.  any(any)*       {
  1728.                          /*
  1729.                           * Write each  word  on  a
  1730.                           * seperate output line.
  1731.                           */
  1732.                          lexecho(stdout);
  1733.                          printf("\n");
  1734.                          wordct++;
  1735.                          return(LEXSKIP);
  1736.                  }
  1737.  eol             {
  1738.                          return(T_EOL);
  1739.                  }
  1740.  white(white)*   {
  1741.                          return(LEXSKIP);
  1742.                  }
  1743.  %%
  1744.  getline()
  1745.  /*
  1746.   * Read a line for lexgetc()
  1747.   */
  1748.  {
  1749.          is_eof = (fgets(line, sizeof line, stdin)
  1750.                          == NULL);
  1751.          linep = &line;
  1752.  }
  1753.  lexgetc()
  1754.  /*
  1755.  
  1756.  A Lexical Analyser Generator                                    Page B-5
  1757.  Some Small Examples
  1758.  
  1759.  
  1760.   * Homemade  lexgetc  --  return zero while at the
  1761.   * end of an input line or EOF at end of file.  If
  1762.   * more on this line, return the next byte.
  1763.   */
  1764.  {
  1765.          return(   (is_eof) ?            EOF
  1766.                  : (*linep == 0) ?       0
  1767.                  :                       *linep++);
  1768.  }
  1769.